home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
mercury
/
patternm.c
< prev
next >
Wrap
Text File
|
1995-01-06
|
4KB
|
116 lines
/*
MercuryInstaller for MS-DOS
文字列照合ルーチン
*/
#include<ctype.h>
#include<farstr.h>
#include<jctype.h>
#include<jstring.h>
#include"mercury.h"
/*------------------------------グローバル変数-------------------------------*/
static char Scanpattern[128] = "";
/*-----------------------------全角文字の半角化------------------------------*/
/* 標準のhantozenと違い、カタカナ・ひらがなに完全対応。 */
/* なお、変換結果が2バイト(変換不可能な文字、(半)濁点のついた文字)になる場 */
/* 合は、そのデータをbig endianで詰めて返す。 */
/*---------------------------------------------------------------------------*/
/* 全角文字の内部表現がシフトJISでない場合は(L'c'が使えれば無変更でEUC対応に*/
/* できるのに(;_;))書き直すこと。 */
/*---------------------------------------------------------------------------*/
#define KATA_HANTOZEN(c) Kanatbl[(c)-0x8340]
#define A(c) ((unsigned char)(c))
#define B(c) ( ((c)<<8) + (unsigned char)'゙' )
#define C(c) ( ((c)<<8) + (unsigned char)'゚' )
static unsigned short Kanatbl[] =
{
A('ァ'),A('ア'),A('ィ'),A('イ'),A('ゥ'),A('ウ'),A('ェ'),A('エ'),
A('ォ'),A('オ'),A('カ'),B('カ'),A('キ'),B('キ'),A('ク'),B('ク'),
A('ケ'),B('ケ'),A('コ'),B('コ'),A('サ'),B('サ'),A('シ'),B('シ'),
A('ス'),B('ス'),A('セ'),B('セ'),A('ソ'),B('ソ'),A('タ'),B('タ'),
A('チ'),B('チ'),A('ッ'),A('ツ'),B('ツ'),A('テ'),B('テ'),A('ト'),
B('ト'),A('ナ'),A('ニ'),A('ヌ'),A('ネ'),A('ノ'),A('ハ'),B('ハ'),
C('ハ'),A('ヒ'),B('ヒ'),C('ヒ'),A('フ'),B('フ'),C('フ'),A('ヘ'),
B('ヘ'),C('ヘ'),A('ホ'),B('ホ'),C('ホ'),A('マ'),A('ミ'),0x007f,
A('ム'),A('メ'),A('モ'),A('ャ'),A('ヤ'),A('ュ'),A('ユ'),A('ョ'),
A('ヨ'),A('ラ'),A('リ'),A('ル'),A('レ'),A('ロ'),0x838e,A('ワ'),
0x8390,0x8391,A('ヲ'),A('ン'),0x8394,0x8395,0x8396
};
static unsigned short ds_zentohan(unsigned short c)
{
if (jishira(c))
c = jtokata(c);
if (jiskata(c))
c = KATA_HANTOZEN(c);
else switch(c)
{
case 0x8175: c = (unsigned char)'「'; break;
case 0x8176: c = (unsigned char)'」'; break;
case 0x8141: c = (unsigned char)'、'; break;
case 0x8142: c = (unsigned char)'。'; break;
case 0x8145: c = (unsigned char)'・'; break;
case 0x814a: c = (unsigned char)'゙'; break;
case 0x814b: c = (unsigned char)'゚'; break;
default: c = zentohan(c); break;
}
return c;
}
/*-----------------------------文字列の「正規化」----------------------------*/
/* ○ひらがなはカタカナにする */
/* ○半角化できる全角文字は半角化する */
/* ○英小文字は大文字にする */
/*---------------------------------------------------------------------------*/
/* なお、Dataからsrcを引っ張ってくることを考えて、srcはfarポインタ。 */
/*---------------------------------------------------------------------------*/
extern void normalize_string(char *dst,char far *src)
{
unsigned short c;
while ((c=*src++)!='\0')
{
if (iskanji(c))
c = ds_zentohan((c<<8) + *src++);
if (c>>8)
{
*dst++ = c>>8;
*dst++ = c;
}
else
*dst++ = toupper(c);
}
*dst = '\0';
}
/*----------------------------パターンマッチの準備---------------------------*/
/* gnu regexで置き換える場合はこれはオートマトン生成関数になる */
/*---------------------------------------------------------------------------*/
extern void patternmatch_init(char *s)
{
normalize_string(Scanpattern,s);
}
/*---------------------------------照合--------------------------------------*/
extern int patternmatch(char far *s)
{
char buf[128];
if (Scanpattern[0]=='\0')
return 1;
normalize_string(buf,s);
if (jstrstr(buf,Scanpattern)!=NULL)
return 1;
else
return 0;
}
/*--------------------------End of patternmatch.c----------------------------*/